﻿#include"Stack.h"


// 初始化栈 
void StackInit(Stack* ps)
{
	assert(ps);
	ps->_a = (STDataType*)malloc(sizeof(STDataType) * 4);//初始化申请四个空间
	if (!ps->_a)
	{
		perror("malloc fail!\n");
		exit(-1);
	}
	ps->_capacity = 4;//空间计数为4个
	ps->_top = 0;//栈顶置为0
}

// 入栈 
void StackPush(Stack* ps, STDataType data)
{
	assert(ps);
	if (ps->_top == ps->_capacity)//扩容
	{
		STDataType* tmp = (STDataType*)realloc(ps->_a, 2 * (ps->_capacity)  * sizeof(STDataType));//扩容原来的两倍
		ps->_a = tmp;//交付空间
		(ps->_capacity) *= 2;//空间乘2
	}
	ps->_a[(ps->_top)++] = data;//赋值栈顶
}

// 出栈 
void StackPop(Stack* ps)
{
	assert(ps);
	if ((ps->_top) != 0)
	{
		--(ps->_top);//栈顶指针后移
	}
}

// 获取栈顶元素 
STDataType StackTop(Stack* ps)
{
	assert(ps);
	return ps->_a[(ps->_top)-1];
}

// 获取栈中有效元素个数 
int StackSize(Stack* ps)
{
	return (ps->_top);
}

// 检测栈是否为空，如果为空返回1，如果不为空返回0 
int StackEmpty(Stack* ps)
{
	assert(ps);
	return (ps->_top == 0);
}

// 销毁栈 
void StackDestroy(Stack* ps)
{
	assert(ps);
	free(ps->_a);
	ps->_a = NULL;
	ps->_capacity = 0;
	ps->_top = 0;
}



//if (StackEmpty(&obj->popsk))//如果出栈队列为空则从入栈队列中全部拷贝过来
//{
//	while (!StackEmpty(&obj->pushsk))//入栈序列是否为空
//	{
//		StackPush(&obj->popsk, StackTop(&obj->pushsk));//取入栈栈顶元素存入出栈栈中
//		StackPop(&obj->pushsk);//入栈序列栈顶出栈
//	}
//
//}